package cn.t.keycloak.plugin.login.rest;

import cn.t.keycloak.plugin.login.jpa.VerifyPhoneEntity;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import org.keycloak.connections.jpa.JpaConnectionProvider;
import org.keycloak.models.KeycloakSession;
import org.keycloak.services.resource.RealmResourceProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 端点服务提供者,在这个provider中可以自定义rest服务
 * @author 陶敏麒
 * @date 2023/11/7 10:06
 */
public class DemoRestProvider implements RealmResourceProvider {

    private static final Logger log = LoggerFactory.getLogger(DemoRestProvider.class);

    // keycloak会话
    private final KeycloakSession session;
    public DemoRestProvider(KeycloakSession session) {
        this.session = session;
    }
    @Override
    public Object getResource() {
        // 需要返回一个JAX-RS对象,即支持rest服务的对象
        // Java™ API for restful Web Services (JAX-RS)
        // 因为本例提供rest服务的就是自己,所以直接返回自身即可
        // 实际开发中可以自定义一个rest对象,然后在这里返回它就行
        // return new DemoRest(); // 这个DemoRest内部按照JAX-RS标准执行,即@GET、@Path、@Produces方式指定资源
        return this;
    }

    @Override
    public void close() {
        log.warn("DemoRestProvider关闭");
    }


    // *******************自定义端点

    /**
     * 可以通过下面的方式访问
     * {kc-host}/realms/{realm-name}/{provider定义的ID}/hello
     */
    @GET
    @Path("/hello")
    @Produces(MediaType.APPLICATION_JSON)
    public Object hello() {
        var provider = this.session.getProvider(JpaConnectionProvider.class).getEntityManager();
        return provider.find(VerifyPhoneEntity.class, "77306624-0a95-4d37-9529-d711868b015c");
    }
}
